package com.cmc.cloud.cmclink.doc.service;

import com.cmc.cloud.cmclink.doc.entity.SpecialCargoApplyDO;
import com.cmc.cloud.cmclink.doc.vo.sovo.sovslvoyvo.SoVslvoyRespVO;
import com.cmc.cloud.cmclink.doc.vo.specialcargoapplyvo.*;
import com.cmc.cloud.cmclink.doc.vo.specialcargodgvo.DgByBookingNo;
import com.cmes.framework.common.pojo.PageResult;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 特种货审批主信息 Service 接口
 *
 * @author 集运管理员
 */
public interface SpecialCargoApplyService {

    /**
     * 删除特种货审批主信息
     *
     * @param id 编号
     */
    void deleteSpecialCargoApply(Long id);

    /**
     * 获得特种货审批主信息列表
     *
     * @param reqVO 编号
     * @return 特种货审批主信息下的航线审批信息
     */
    VoyageRespVO getSpecialCargoApplyVoyage(SpecialCargoVoyageReqVO reqVO);

    /**
     * 获得特种货审批主信息分页
     *
     * @param pageReqVO 分页查询
     * @return 特种货审批主信息分页
     */
    PageResult<ApplyAndVoyageInfoVO> getSpecialCargoApplyPage(SpecialCargoApplyPageReqVO pageReqVO);

    /**
     * 获取特殊货物申的导出数据列表
     *
     * @param reqVO 分页查询
     * @return 符合筛选条件的特殊货物申请与航次关联信息的导出视图列表，
     */
    List<ApplyAndVoyageInfoExportVO> getExportList(SpecialCargoApplyPageReqVO reqVO);

    /**
     * 获得特种货审批主信息列表
     *
     * @param applyId applyId
     * @param applyUser applyUser
     * @param changeVoyCheck changeVoyCheck
     */
    void createApproval(Long applyId, String applyUser, boolean changeVoyCheck);

    /**
     * 获取booking no列表
     *
     * @return booking no列表
     */
    List<String> getBookingNo();

    /**
     * 取消审批
     *
     * @param applyId  审批请求参数
     * @param backEdit 取消操作类型
     */
    void cancelApply(Long applyId, boolean backEdit);

    /**
     * 取消审批
     *
     * @param applyIds 审批请求参数
     */
    void returnEdit(List<Long> applyIds);

    /**
     * 新申请
     *
     * @param req 审批请求参数
     * @return 新申请的booking no
     */
    String newApply(@Valid SpecialApplyCommonReqVO req);

    /**
     * 审批
     *
     * @param req 审批请求参数
     * @return 审批结果
     */
    String perCheck(@Valid ApplyAndVoyageInfoVO req);

    /**
     * 根据booking no查询
     *
     * @param bookingNos bookings列表
     * @return do列表
     */
    List<SpecialCargoApplyDO> getByBookingNos(List<String> bookingNos);

    /**
     * 根据booking no查询
     *
     * @param bookingNo bookingNo
     * @return DO对象
     */
    SpecialCargoApplyDO getByBookingNo(String bookingNo);

    /**
     * 船名航次维护
     *
     * @param vslvoyListMap voyageInfo vslvoyListMap
     */

    void updateVslvoy(Map<String, SoVslvoyRespVO> vslvoyListMap);

    /**
     * 获得DG信息
     *
     * @param bookingNo bookingNo
     * @return DgByBookingNoReqVO
     */
    List<DgByBookingNo> getDgByBookingNo(String bookingNo);

    /**
     * 创建和提交特种货总接口
     *
     * @param createReqVO 总接口入参
     * @return Long applyId
     */
    Long createOrCommitSpc(CreateOrCommitSpcReqVO createReqVO);

    /**
     * 获取特种货相关页面全部信息接口
     *
     * @param id 主信息ID
     * @return SpecialCargoApplyRespVO
     */
    SpecialCargoApplyRespVO getSpecialCargoApplyInfo(Long id);

    /**
     * 复制主信息
     *
     * @param originalVo 主信息ID
     * @return SpecialCargoApplyRespVO
     */
    SpecialCargoApplyRespVO copySpc(@Valid SpecialApplyCommonReqVO originalVo);

    /**
     * 新建OOG查询字典是否卸货港车船直取
     *
     * @param delCode delCode
     * @return boolean
     */
    boolean directTruckPod(String delCode);
}
